package preprocess;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Classe offrant des fonctions simplifiant l'usage des regexps.
 * @author simon
 *
 */
public class RegexpTools {

	/**
	 * Simple petite fonction pour eviter de mettre des patterns et des matchers partout dans le code.
	 * @param reg la regexp appliquée.
	 * @param str la chaine sur laquelle la regexp sera appliquée.
	 * @return le matcher construit en appliquant la regexp.
	 */
	public static Matcher buildMatcher(String reg, String str) {
		
		Pattern patt = Pattern.compile(reg) ;
		return patt.matcher(str) ;
		
	}
	
	/**
	 * Supprime tout ce qui matche la regexp.
	 * @param reg la regexp appliquée.
	 * @param str la chaine sur laquelle la regexp sera appliquée.
	 * @return la chaine où tout ce qui matchait reg a été supprimé de str.
	 */
	public static String removeMatches(String reg, String str) {
		
		Matcher m = buildMatcher(reg,str) ;
		return m.replaceAll("") ;
		
	}
	
	/**
	 * Filtre ne gardant QUE ce qui matche la regexp.
	 * @param reg la regexp appliquée.
	 * @param str la chaine sur laquelle la regexp sera appliquée.
	 * @return la chaine où seul ce qui matchait la regexp a été gardé.
	 */
	public static String filterMatches(String reg, String str) {
		
		String result = "" ;
		Matcher m = buildMatcher(reg,str) ;
		while(m.find()) {
			result = result + m.group() ;
		}
		return result ;
		
	}
	
	/**
	 * Enlève tout ce qui se trouve entre deux regexps. Attention, par defaut les regexps sont greedies !
	 * Notons que cette fonction va faire le matche plusieurs fois si possible.
	 * @param reg1 regexp du début.
	 * @param reg2 regexp de fin.
	 * @param str string sur laquelle porte la recherche.
	 * @return Str privé de tout ce qui se trouvait entre les deux matches.
	 */
	public static String removeBetween(String reg1, String reg2, String str) {
		
		/* Constuire un matcher capturant ce qu'il y a entre les deux patterns donnés */
		Matcher m = buildMatcher("("+reg1+")(.*?)("+reg2+")",str) ;
		return m.replaceAll("$1"+"$3") ;
		
	}
	
	/**
	 * Garde tout ce qui se trouve entre deux regexps. Attention, par defaut les regexps sont greedies !
	 * Notons que cette fonction va faire le match plusieurs fois si possible.
	 * @param reg1 regexp du début.
	 * @param reg2 regexp de fin.
	 * @param str string sur laquelle porte la recherche.
	 * @return tout ce qui qui se trouve entre les deux matches de début et de fin.
	 */
	public static String filterBetween(String reg1, String reg2, String str) {
		
		/* Constuire un matcher capturant (reluctant) ce qu'il y a entre les deux patterns donnés */
		Matcher m = buildMatcher(reg1+"(.*?)"+reg2,str) ;
		String result = "" ;
		while(m.find()) {
			result=result+m.group(1) ;
		}
		return result ;
		
	}
	
	/**
	 * Fonction extrayant la valeur d'une variable dans une chaine type PHP (.../?var="foo"...)
	 * @param s chaine à traiter.
	 * @param var nom de la variable à extraire
	 * @return valeur de la variable (null si le champ demandé n'a pas été trouvé).
	 */
	public static String getValue(String s, String var) {
		
		Matcher m = buildMatcher("\\?"+var+"=([^?]*)",s) ;
		m.find() ;
		return m.group(1) ;
		
	}
	
	public static void main(String[] args) {
		
		System.out.println(removeMatches("p\\S*? ","paul plus ça va et plus ça va pas cool")) ;
		System.out.println(filterMatches("p\\S*? ","paul plus ça va et plus ça va pas cool")) ;
		System.out.println(removeBetween("p.f","p.f","pif je pof arg pof suis pof erf paf beau pef")) ;
		System.out.println(filterBetween("p.f","p.f","pif je pof arg pof suis pof paf malin pef")) ;
		
	}
	
}
